package com.example.spring.test;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 1.回环栏栅这个类，让所有的现场都去相互等待，直到它们都到达了一个栏栅的点。
 * 2.通过它可以实现让一组线程等待至某个状态之后再全部同时执行。
 * 叫做回环是因为当所有等待线程都被释放以后，CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier，当调用await()方法之后，线程就处于barrier了。
 */
public class CyclicBarrierTest1 {

    public static void main(String[] args) {
        final int N = 4;
        CyclicBarrier barrier = new CyclicBarrier(N);
        for (int i = 0; i < N; i++) {
            new Thread(new Writer(barrier)).start();
        }


    }

    static class Writer implements Runnable {
        CyclicBarrier barrier;

        public Writer(CyclicBarrier barrier) {
            this.barrier = barrier;
        }

        @Override
        public void run() {

            String name = Thread.currentThread().getName();
            System.out.println(name + "开始读写数据");

            try {
                Thread.sleep(4000);
                System.out.println(name + "结束读写数据");
                barrier.await();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + "所以线程都读取完毕，开始其他的操作");
        }
    }
}

